package com.vayne.thread;

/**
 * 关于此方法验证的两点说明
 * 1）volatile 不能保证原子性，所以在多个线程同时处理 static 变量 count 时会出现并发错误
 * 2）synchronize 既可以保证可见性，也能保证原子性，所以把整个 Class 加锁是能保证正确性的，这时候也就不用加 volatile 了
 *
 * @author xuerui.zhang
 * @since 2020/4/25 下午7:11
 */
public class VolatileSyncDemo {

    public static void main(String[] args) {
        VolatileThread[] myThreads = new VolatileThread[100];
        for (int i = 0; i < 100; i++) {
            myThreads[i] = new VolatileThread();
        }
        for (int i = 0; i < 100; i++) {
            myThreads[i].start();
        }
    }
}

class VolatileThread extends Thread {

    private volatile static int count;

    private static void sum() {
        for (int i = 0; i < 100; i++) {
            count++;
        }
        System.out.println("count=" + count);
    }

    @Override
    public void run() {
        sum();
    }
}
